package date0703am;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import cn.edu.ecut.util.DatabaseType;
import cn.edu.ecut.util.JdbcHelper;

public class JdbcTest14 {

	public static void main(String[] args) throws SQLException {
		
		final String select = "SELECT e.empno AS eno , e.ename, d.deptno , d.dname FROM emp e JOIN DEPT d ON e.deptno = d.deptno " ;
		
		JdbcHelper h = JdbcHelper.getInstance( DatabaseType.ORACLE );
		// Statement s = h.create(); // 创建 Statement 对象
		// ResultSet rs = s.executeQuery( select ) ; // "执行" 查询语句
		
		PreparedStatement s = h.prepare( select );
		// 因为 select 语句中没有 参数占位符 ，所以可以不设置 参数值
		ResultSet rs = s.executeQuery(); // 不要在 executeQuery 参数中再指定 SQL 语句
		System.out.println( "result set : " + rs );
		
		// 通过结果集对象来获取 结果集元数据 ( ResultSetMetaData ) 
		ResultSetMetaData rsmd = rs.getMetaData();
		
		final int columnCount = rsmd.getColumnCount(); // 获取查询结果中的列数 ( 不一定是表中的列数 )
		System.out.println( "查询结果中包含 " + columnCount + " 列");
		
		for( int i = 1 ; i <= columnCount ; i++ ) {
			// 获得第 i 列的 标签名 ( 列名 或 列别名 )
			String label = rsmd.getColumnLabel( i ); // 如果指定果列的别名，就返回列的别名
			label = label.toLowerCase();
			
			int type = rsmd.getColumnType( i ); // 获取 该列对应的 JDBC Type ( 是个数字 ，这些数字对应着 java.sql.Types 类中常量 )
			String typeName = rsmd.getColumnTypeName( i );
			
			int precision = rsmd.getPrecision( i ); // 获取精度
			
			String className = rsmd.getColumnClassName( i ) ; // 获取第 i 列对应的 Java 类的名称
			
			System.out.println( label + " , " + type + " , " + typeName + " , " + precision  + " , " + className );
		}
		
		h.close( rs );
		h.close( s );
		h.release();

	}

}
